#include "main.h"

// 要求将所有代码写在本文件内

// 必须实现下列函数。可以自行增加别的函数。因为采用由代码实现的自动测试用例，所以没有实现上述函数，会有扣分。

// 请勿修改由老师所提供的main.h文件的内容。


// 判断刚扫描到的symbol是否操作符。如果symbol是操作符，返回1，否则返回0。
bool is_operator(char symbol) {
    if (symbol == '+'||symbol == '-'||symbol == '*'||symbol == '/'||symbol == '#'||symbol == '('||symbol == ')'){
        return 1;
    } else
        return 0;
}

// 判断刚扫描到的symbol是否操作数。如果symbol是操作数，返回1，否则返回0。
bool is_operand(char symbol) {
    if (symbol == '1'||symbol == '2'||symbol == '3'||symbol == '4'||symbol == '5'||symbol == '6'||symbol == '7'||symbol == '8'|| symbol == '9'){
        return 1;
    } else
        return 0;
}

// 初始化名为s的栈，初始化成功，返回0，否则返回1。
int init_stack(Stack * s) {
    *s = (struct stack *)malloc(sizeof(struct stack));  // 分配头结点。

    if (*s == NULL)
        return 1;  // 内存不足，返回失败。

    (*s)->top=NULL;  // 头结点的下一结点暂时不存在，置空。

    return s;
}

// 入栈。返回值表示是否压栈成功：0，成功；1，不成功。
int push(Stack s, char operator_or_operand) {
    int lenth;
    lenth = s->top - s->base;
    if (lenth >= s->number_of_elements){
        s->base = (char *)realloc(s->base,(s->number_of_elements + STACK_MAX_SIZE)* sizeof(char ));
        if(!s->base){
            return 1;
        }
        s->top = s->number_of_elements + s->base;
        s->number_of_elements += STACK_MAX_SIZE;
    }
    *(s->top) = p_operator_or_operand;
    s->top++;
}

// 出栈。返回值表示是否出栈成功：0，成功，1，不成功。
int pop(Stack s, char* p_operator_or_operand) {
    if (s->top == s->base){
        return 1;
    } else{
        s->top--;
        p_operator_or_operand = *(s->top);
        return 0;
    }
}

// 只返回栈顶元素，通过result变量返回栈顶元素的值。函数返回值用于表示执行状态：0，成功；1，不成功。
int get_top(Stack s, char * result) {
  return 0;
}

// 处理操作符。operator_on_stack_top表示操作符栈栈顶的操作符，just_scanned_operator表示从表达式里刚刚读取的操作符。返回值表示优先级：
//  -1, operator_on_stack_top 的优先级低于 just_scanned_operator；
//  0，operator_on_stack_top 的优先级等于 just_scanned_operator；
//  1，operator_on_stack_top 的优先级高于 just_scanned_operator。
int compare_operators(char operator_on_stack_top, 
                      char just_scanned_operator) {
  return 0;
}

// 用于简单计算+，-，*，/，operator表示操作符，left_operand表示左操作数，right_operand表示右操作数，结果通过result返回。函数返回值表示计算状态：0，计算成功；1，不成功。
int caculate(char operator, char left_operand, char right_operand, int * result) {
  return 0;
}

// 最主要的函数，用于计算表达式的值，比如#3*(2+6)/4#。返回值表示求值状态：0，合法表达式，成功求值；1，表达式不合法。result变量用于返回计算结果。
int evaluate(char * expression, int * result) {
  return 0;
}

// 编写你们组自己使用的测试代码
int main(int argc, char * argv[]) {
  return 0;
}